/*
   FieldVis - A Tool for Visualizing Astrophysical Magnetohydrodynamic Flow
   
   Copyright (C) 2006 - 2008     FieldVis Development Team
  
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
  
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
  
   You should have received a copy of the GNU General Public License along
   with this program; if not, write to the Free Software Foundation, Inc.,
   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

   File     : Integrator.h
   Author   : Blayne Field
   
   Purpose  : Definition header file for the Integrator class.  This class 
              provides methods for calculating streamline paths by using a
              4th order, adaptive step-size Runge-Kutta algorithm.
*/

#ifndef INTEGRATOR_H
#define INTEGRATOR_H

#include <cmath>

#include "Point.h"
#include "Field.h"
#include "StreamlinePath.h"

const int FORWARD(1);
const int BACKWARD(-1);


class Integrator
{
public:
   
   Integrator(VectorField *pVf) : vf(pVf) { }
   ~Integrator()     { }

   StreamlinePath CalculateBidirectionalPath(Point p0, int steps, float threshold);
   StreamlinePath CalculatePath(Point p0, int maxSteps, int dir, float threshold);

private:
   
   VectorField *vf;
   Point TakeRK4Step(Point p0, float stepSize, bool *successful);
};

#endif
